package salesforce;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

// This is the interface that allows for creating nested lists.
// You should not implement it, or speculate about its implementation
interface NestedInteger {

    // @return true if this NestedInteger holds a single integer, rather than a nested list.
    public boolean isInteger();

    // @return the single integer that this NestedInteger holds, if it holds a single integer
    // Return null if this NestedInteger holds a nested list
    public Integer getInteger();

    // @return the nested list that this NestedInteger holds, if it holds a nested list
    // Return empty list if this NestedInteger holds a single integer
    public List<NestedInteger> getList();
}

//LC 341 扁平化嵌套列表迭代器
public class NestedIterator implements Iterator<Integer> {
    List<Integer> list = new ArrayList<>();
    Iterator<Integer> it;  //很重要

    public NestedIterator(List<NestedInteger> nestedList) {
        dfs(nestedList);
        it = list.iterator();
    }

    private void dfs(List<NestedInteger> nestedList) {
        for (NestedInteger nest : nestedList) {
            if (nest.isInteger()) {
                list.add(nest.getInteger());
            }else {
                dfs(nest.getList());
            }
        }
    }

    @Override
    public Integer next() {
        // return list.iterator().next(); 不能这么写，内存会爆
        return it.next();
    }

    @Override
    public boolean hasNext() {
        return it.hasNext();
    }
}
